package com.brightgenerous.niconama02;

import com.brightgenerous.niconama02.player.SimplePlayer;
import com.brightgenerous.niconama02.player.VisualPlayer;
import com.brightgenerous.niconama02.player.VisualRecoder;
import com.brightgenerous.niconama02.project.madokamagica.MadokamagicaStageProject;
import com.brightgenerous.niconama02.stage.Stage;


/**
 * 「初心者のための逆に考えるオブジェクト指向」サンプルプログラムの実行起点クラス
 * 
 * @author brigen
 */
public class Mains {

	/**
	 * 実行可能インターフェース
	 * 
	 * @author brigen
	 */
	private static interface Execable {

		/**
		 * 実行する
		 */
		void exec();
	}

	/**
	 * 実行起点クラスその１
	 * 
	 * @author brigen
	 */
	public static class Main01 implements Execable {

		public static void main(String[] x_args) {
			Execable execable = new Main01();
			execable.exec();
		}

		/**
		 * 実行する
		 */
		@Override
		public void exec() {
			// まどか☆マギカ(舞台)プロジェクトにお越しいただく
			MadokamagicaStageProject stageProject = MadokamagicaStageProject.getProject();
			// 舞台プロジェクトに舞台をプロデュースしていただく
			Stage stage = stageProject.produce();
			// 舞台を開始する
			stage.start(new SimplePlayer());
		}
	}

	/**
	 * 実行起点クラスその２
	 * 
	 * @author brigen
	 */
	public static class Main02 implements Execable {

		public static void main(String[] x_args) {
			Execable execable = new Main02();
			execable.exec();
		}

		/**
		 * 実行する
		 */
		@Override
		public void exec() {
			// まどか☆マギカ(舞台)プロジェクトにお越しいただく
			MadokamagicaStageProject stageProject = MadokamagicaStageProject.getProject();
			// 舞台プロジェクトに舞台をプロデュースしていただく
			Stage stage = stageProject.produce();
			// 舞台を開始する
			VisualRecoder recoder = new VisualRecoder();
			stage.start(recoder);
			VisualPlayer player = new VisualPlayer();
			player.play(recoder);
		}
	}
}